package com.example.springboottpl.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.springboottpl.dao.MenuDao;
import com.example.springboottpl.dao.RoleMenuDao;
import com.example.springboottpl.entity.MenuBean;
import com.example.springboottpl.entity.RoleMenuBean;
import com.example.springboottpl.service.MenuService;
import com.example.springboottpl.util.Result;
import com.example.springboottpl.util.ResultPage;
import com.example.springboottpl.vo.common.DeleteReqVo;
import com.example.springboottpl.vo.common.QueryDetailReqVo;
import com.example.springboottpl.vo.common.UpdateStatusReq;
import com.example.springboottpl.vo.req.MenuReqVo;
import com.example.springboottpl.vo.req.QueryMenuReqVo;
import com.example.springboottpl.vo.resp.MenuRespVo;
import com.example.springboottpl.vo.resp.MenuSimpleRespVo;

/**
 * 描述：菜单信息
 * 作者：刘飞华
 * 日期：2025-01-14 10:40:16
 */
@Service
public class MenuServiceImpl implements MenuService {

    @Autowired
    private MenuDao menuDao;

    @Autowired
    private RoleMenuDao roleMenuDao;

    /**
     * 添加菜单信息
     *
     * @param menu 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025-01-14 10:40:16
     */
    @Override
    public Result<Integer> addMenu(MenuReqVo menu) {
        String menuName = menu.getMenuName();
        String menuUrl = menu.getMenuUrl();

        if (menuDao.selectCount(Wrappers.<MenuBean>lambdaQuery().eq(MenuBean::getMenuName, menuName)) > 0) {
            return Result.error("菜单名称已存在");
        }

        if (StringUtils.isNotBlank(menuUrl)) {
            if (menuDao.selectCount(Wrappers.<MenuBean>lambdaQuery().eq(MenuBean::getMenuUrl, menuUrl)) > 0) {
                return Result.error("路由路径已存在");
            }
        }

        MenuBean bean = new MenuBean();
        bean.setMenuName(menuName); //菜单名称
        bean.setMenuType(menu.getMenuType()); //菜单类型(1：目录   2：菜单   3：按钮)
        bean.setVisible(menu.getVisible()); //显示状态（0:隐藏, 显示:1）
        bean.setStatus(menu.getStatus()); //菜单状态(1:正常，0:禁用)
        bean.setSort(menu.getSort()); //排序
        bean.setParentId(menu.getParentId()); //父ID
        bean.setMenuUrl(menuUrl); //路由路径
        bean.setApiUrl(menu.getApiUrl()); //接口URL
        bean.setMenuIcon(menu.getMenuIcon()); //菜单图标
        bean.setRemark(menu.getRemark()); //备注

        int i = menuDao.insert(bean);
        return Result.success(i);
    }

    /**
     * 删除菜单信息
     *
     * @param menu 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025-01-14 10:40:16
     */
    @Override
    public Result<Integer> deleteMenu(DeleteReqVo menu) {
        if (menuDao.selectCount(Wrappers.<MenuBean>lambdaQuery().eq(MenuBean::getParentId, menu.getId())) > 0) {
            return Result.error("存在子菜单,不允许删除");
        }

        if (roleMenuDao.selectCount(Wrappers.<RoleMenuBean>lambdaQuery()
                                            .eq(RoleMenuBean::getMenuId, menu.getId())) > 0) {
            return Result.error("菜单已分配,不允许删除");
        }

        int i = menuDao.deleteById(menu.getId());
        return Result.success(i);
    }

    /**
     * 更新菜单信息
     *
     * @param menu 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025-01-14 10:40:16
     */
    @Override
    public Result<Integer> updateMenu(MenuReqVo menu) {
        Long id = menu.getId();
        String menuName = menu.getMenuName();
        String menuUrl = menu.getMenuUrl();

        MenuBean res = menuDao.selectById(id);
        if (res == null) {
            return Result.error("菜单信息不存在");
        }

        if (menuDao.selectCount(Wrappers.<MenuBean>lambdaQuery()
                                        .eq(MenuBean::getMenuName, menuName)
                                        .ne(MenuBean::getId, id)) > 0) {
            return Result.error("菜单名称已存在");
        }

        if (StringUtils.isNotBlank(menuUrl)) {
            if (menuDao.selectCount(Wrappers.<MenuBean>lambdaQuery()
                                            .eq(MenuBean::getMenuUrl, menuUrl)
                                            .ne(MenuBean::getId, id)) > 0) {
                return Result.error("路由路径已存在");
            }
        }

        MenuBean bean = new MenuBean();
        bean.setId(id);//主键
        bean.setMenuName(menuName);//菜单名称
        bean.setMenuType(menu.getMenuType());//菜单类型(1：目录   2：菜单   3：按钮)
        bean.setVisible(menu.getVisible());//显示状态（0:隐藏, 显示:1）
        bean.setStatus(menu.getStatus());//菜单状态(1:正常，0:禁用)
        bean.setSort(menu.getSort());//排序
        bean.setParentId(menu.getParentId());//父ID
        bean.setMenuUrl(menuUrl);//路由路径
        bean.setApiUrl(menu.getApiUrl());//接口URL
        bean.setMenuIcon(menu.getMenuIcon());//菜单图标
        bean.setRemark(menu.getRemark());//备注

        int i = menuDao.updateById(bean);
        return Result.success(i);
    }

    /**
     * 更新菜单信息状态
     *
     * @param menu 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025-01-14 10:40:16
     */
    @Override
    public Result<Integer> updateMenuStatus(UpdateStatusReq menu) {

        int i = menuDao.update(Wrappers.<MenuBean>lambdaUpdate()
                                       .in(MenuBean::getId, menu.getIds())
                                       .set(MenuBean::getStatus, menu.getStatus()));
        return Result.success(i);
    }

    /**
     * 查询菜单信息详情
     *
     * @param menu 请求参数
     * @return MenuResp
     * @author 刘飞华
     * @date: 2025-01-14 10:40:16
     */
    @Override
    public Result<MenuRespVo> queryMenuDetail(QueryDetailReqVo menu) {

        MenuBean menuBean = menuDao.selectById(menu.getId());
        if (menuBean == null) {
            return Result.error("菜单信息不存在");
        }

        MenuRespVo resp = new MenuRespVo();
        resp.setId(menuBean.getId());//主键
        resp.setMenuName(menuBean.getMenuName());//菜单名称
        resp.setMenuType(menuBean.getMenuType());//菜单类型(1：目录   2：菜单   3：按钮)
        resp.setVisible(menuBean.getVisible());//显示状态（0:隐藏, 显示:1）
        resp.setStatus(menuBean.getStatus());//菜单状态(1:正常，0:禁用)
        resp.setSort(menuBean.getSort());//排序
        resp.setParentId(menuBean.getParentId());//父ID
        resp.setMenuUrl(menuBean.getMenuUrl());//路由路径
        resp.setApiUrl(menuBean.getApiUrl());//接口URL
        resp.setMenuIcon(menuBean.getMenuIcon());//菜单图标
        resp.setRemark(menuBean.getRemark());//备注
        resp.setCreateTime(menuBean.getCreateTime());//创建时间
        resp.setUpdateTime(menuBean.getUpdateTime());//修改时间

        return Result.success(resp);
    }

    /**
     * 查询菜单信息列表
     *
     * @param menu 请求参数
     * @return MenuResp
     * @author 刘飞华
     * @date: 2025-01-14 10:40:16
     */
    @Override
    public Result<List<MenuRespVo>> queryMenuList(QueryMenuReqVo menu) {

        LambdaQueryWrapper<MenuBean> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.ne(MenuBean::getMenuType, 3);
        queryWrapper.orderByAsc(MenuBean::getSort);

        List<MenuRespVo> list = menuDao.selectList(queryWrapper).stream().map(x -> {
            MenuRespVo resp = new MenuRespVo();
            resp.setId(x.getId());//主键
            resp.setMenuName(x.getMenuName());//菜单名称
            resp.setMenuType(x.getMenuType());//菜单类型(1：目录   2：菜单   3：按钮)
            resp.setVisible(x.getVisible());//显示状态（0:隐藏, 显示:1）
            resp.setStatus(x.getStatus());//菜单状态(1:正常，0:禁用)
            resp.setSort(x.getSort());//排序
            resp.setParentId(x.getParentId());//父ID
            resp.setMenuUrl(x.getMenuUrl());//路由路径
            resp.setApiUrl(x.getApiUrl());//接口URL
            resp.setMenuIcon(x.getMenuIcon());//菜单图标
            resp.setRemark(x.getRemark());//备注
            resp.setCreateTime(x.getCreateTime());//创建时间
            resp.setUpdateTime(x.getUpdateTime());//修改时间
            return resp;
        }).collect(Collectors.toList());

        return Result.success(list);

    }

    /**
     * 查询菜单信息(排除按钮)
     *
     * @return List
     * @author 刘飞华
     * @date: 2025/1/20 9:10
     */
    @Override
    public Result<List<MenuSimpleRespVo>> queryMenuListSimple() {
        LambdaQueryWrapper<MenuBean> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.ne(MenuBean::getMenuType, 3);
        queryWrapper.orderByAsc(MenuBean::getSort);
        List<MenuSimpleRespVo> list = menuDao.selectList(queryWrapper).stream().map(x -> {
            MenuSimpleRespVo resp = new MenuSimpleRespVo();
            resp.setId(x.getId());//主键
            resp.setMenuName(x.getMenuName());//菜单名称
            resp.setParentId(x.getParentId());//父ID
            return resp;
        }).collect(Collectors.toList());

        return Result.success(list);
    }


    /**
     * 查询菜单资源
     *
     * @param menu 请求参数
     * @return res
     * @author 刘飞华
     * @date: 2025/10/27 9:42
     */
    @Override
    public Result<ResultPage<MenuRespVo>> queryMenuResourceList(QueryMenuReqVo menu) {
        LambdaQueryWrapper<MenuBean> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(MenuBean::getMenuType, 3);
        queryWrapper.like(menu.getMenuName() != null, MenuBean::getMenuName, menu.getMenuName());
        queryWrapper.eq(menu.getVisible() != null, MenuBean::getVisible, menu.getVisible());
        queryWrapper.eq(menu.getStatus() != null, MenuBean::getStatus, menu.getStatus());
        queryWrapper.eq(menu.getParentId() != null, MenuBean::getParentId, menu.getParentId());

        Page<MenuBean> page = menuDao.selectPage(new Page<>(menu.getPageNo(), menu.getPageSize()), queryWrapper);


        List<MenuRespVo> list = new ArrayList<>();
        for (MenuBean x : page.getRecords()) {
            MenuRespVo resp = new MenuRespVo();
            resp.setId(x.getId());//主键
            resp.setMenuName(x.getMenuName());//菜单名称
            resp.setMenuType(x.getMenuType());//菜单类型(1：目录   2：菜单   3：按钮)
            resp.setVisible(x.getVisible());//显示状态（0:隐藏, 显示:1）
            resp.setStatus(x.getStatus());//菜单状态(1:正常，0:禁用)
            resp.setSort(x.getSort());//排序
            resp.setParentId(x.getParentId());//父ID
            resp.setMenuUrl(x.getMenuUrl());//路由路径
            resp.setApiUrl(x.getApiUrl());//接口URL
            resp.setMenuIcon(x.getMenuIcon());//菜单图标
            resp.setRemark(x.getRemark());//备注
            resp.setCreateTime(x.getCreateTime());//创建时间
            resp.setUpdateTime(x.getUpdateTime());//修改时间

            list.add(resp);
        }

        return Result.success(new ResultPage<>(list, page.getCurrent(), page.getSize(), page.getTotal()));

    }
}